某天我修改了 Portal\AccountUser.cs
,但無論怎麼刷新網站、重啟 IIS,功能還是老樣子。我原本以為是 Cache、是記憶體殘留,甚至懷疑是不是寫錯邏輯,但真相其實是:
我改的是 DLL 的原始碼,但 Web 專案吃的是舊的 DLL。
問題點 | 說明 |
---|---|
專案引用的是 DLL 路徑(非專案參考) | 無法自動同步 DLL 版本 |
Web Site 專案沒有 .csproj | 沒辦法控制 OutputPath 與參考依賴 |
建置 DLL 只是「建出來」,不代表會「複製到 bin」 | 導致網站實際執行仍吃舊 DLL |
概念 | 定義 | 我當時的情境 |
---|---|---|
Solution | 整包 VS 專案,副檔名 .sln |
kgeip.sln |
Project | 功能單位,會編成 DLL/EXE,副檔名 .csproj |
Portal、Component 有,kgeip 沒有(Web Site 專案) |
在進行 DLL 同步優化之前,我的 kgeip
Web Site 專案中引用了 Portal.dll
與 Component.dll
,都是以 BIN 類型的 DLL 引用(齒輪圖示)方式加入
為了讓 Visual Studio 能自動同步 DLL,我改採「專案參考」模式(方塊圖示),流程如下:
Component
與 Portal
這樣一來,Visual Studio 就會:
kgeip
時自動建置這兩個專案kgeip\bin
在處理 DLL 同步問題時,理解這兩種 Visual Studio 專案型別的差別非常重要:
項目 | Web Site 專案 | Web Application 專案 |
---|---|---|
是否有 .csproj 檔案 | ❌ 沒有 | ✅ 有 |
編譯方式 | 執行時動態編譯 | 建置時預編譯為 DLL |
頁面語法 | 使用 CodeFile |
使用 CodeBehind |
F12 導航 | 可能只能跳 metadata | 可直接跳至原始碼 |
DLL 處理方式 | 需手動複製到 bin | 專案參考自動同步 |
適合用途 | 快速測試、小型或舊專案 | 長期維護、企業級系統 |
以我這次案例來說,kgeip
就是一個 Web Site 專案,因此即使在 .sln 中加入 ProjectReferences
,也不會自動將 DLL 複製進 kgeip\bin
。
如果你的專案是長期維護型、需要可控建置流程,建議考慮轉成 Web Application 專案,能大幅降低部署踩雷機率。
kgeip\bin
為了不再每次改完 DLL 後還要手動點 Visual Studio,我決定自己寫一份 .bat
腳本來處理整個建置與同步流程。
一開始,我寫了這樣的基本版本:
@echo off
setlocal
cd /d %~dp0..
msbuild kgeip.sln /t:Clean;Build /p:Configuration=Release
xcopy /Y EDAPortal\bin\Release\EDAPortal.dll kgeip\bin\
xcopy /Y EDAComponent\bin\Release\EDAComponent.dll kgeip\bin\
echo ✅ Done!
pause
這樣做的好處是:
但我遇到一個問題:不是每台機器都有把 msbuild.exe
加到環境變數中,有時會出現「找不到指令」的錯誤。
所以我進一步優化這支腳本,加上自動偵測 msbuild.exe
路徑的邏輯,變成這樣:
@echo off
setlocal ENABLEEXTENSIONS
set "MSBUILD_PATH="
echo 嘗試自動尋找 msbuild.exe...
:: 遍歷常見安裝位置
for %%A in (
"C:\Program Files\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin\MSBuild.exe"
"C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe"
"C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe"
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe"
"C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe"
) do (
if exist %%~A (
set "MSBUILD_PATH=%%~A"
goto :found
)
)
:found
if not defined MSBUILD_PATH (
echo 找不到 msbuild.exe,請確認是否已安裝 Visual Studio Build Tools。
pause
exit /b 1
)
echo 使用 msbuild.exe: %MSBUILD_PATH%
cd /d %~dp0..
"%MSBUILD_PATH%" kgeip.sln /t:Clean;Build /p:Configuration=Release
echo 複製 DLL 到網站 bin...
xcopy /Y EDAComponent\bin\Release\EDAComponent.dll kgeip\bin\
xcopy /Y EDAPortal\bin\Release\EDAPortal.dll kgeip\bin\
echo 完成:建置並複製 DLL 至網站 bin\
pause
這段腳本的亮點在於:
特性 | 說明 |
---|---|
✅ 自動搜尋 | 不依賴環境變數,會在常見 VS 安裝路徑中自動找出 msbuild.exe |
✅ 相容性高 | 支援 VS 2019 與 2022(BuildTools、Community、Professional 版本) |
✅ 執行穩定 | 找不到會明確顯示錯誤,避免默默失敗 |
這支腳本現在成為我本地專案的必備工具,每次只要雙擊執行,就能把所有 DLL 最新編譯並同步到網站專案,部署乾淨又安心。
✅ 開發機透過 build.bat
一鍵清除+建置+複製
✅ 正式機只接收打包好的 kgeip\bin
+ .aspx
+ 靜態資源
✅ 沒推任何 DLL 上 Git,只保留原始碼與 .sln
✅ 不需手動進 Visual Studio,部署流程變得乾淨又安心
若你遇到 DLL 沒更新的問題,可詢問: